本篇要來講述 Prometheus Server 的寫入流程。
先以「Http 上下游對應流量」為例,之後再說明其他寫入流程的異同。
將 Http Client 加上 Prometheus Client 的中間件後,這個 Client 可以同時被不同 thread 使用。每個 thread 在發送** http 請求得到結果後**,會各自增加對應標籤的計數器值。lock 在標籤所對應的計數器上,所以不同標籤的計數器可以同時被增加。
除非是新的標籤組合,CounterVec
會用 mutex 確保同一時間只能產生一個新計數器。
Prometheus Server 在載入設定檔後,對於每個 job 都會開一個 goroutine 來定期抓取指標。每到抓取時間,http 發送到 Prometheus Client 的 /metrics
端口。這時 Prometheus Client 的 Registry 會利用有限的 goroutine,一一對所有的 Vec
呼叫 Collect
,要求傳回所有的計數器值。這時 CounterVec
會用 mutex 確保沒有新的標籤組合,讀出所有不同標籤的計數器值(但並不阻止計數器增減),再將 mutex 釋放。
所有 Vec
的 Collect
都完成後,Registry 會將所有的指標值整理排序,變成 http response。
Prometheus Server 在收到 /metrics
的 http response 後,會將所有的指標值加入到抽象的 fanout storage 中,fanout storage 會把指標值分發給 local storage wal 和 remote storage。